package com.mmq.ets.controleur;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import com.mmq.ets.modele.CommBase;
import com.mmq.ets.modele.GestionaireFormes;
import com.mmq.ets.util.Labo2Const;
import com.mmq.ets.visuel.FenetrePrincipale;
/**
 *  ControleurFrontal gére les tous les actions possibles de utilisateur. Il synchronise le modèle et la vue
 * 	@author Francisco Quilodran Chavez
	@version 1.1
 */
public class ControleurFrontal 
{

	/**
	 * Constructeur sans paramètre
	 */
	public ControleurFrontal()
	{}
	/**
	 * Référence de la connexion
	 */
	private CommBase commBaseRef;
	/**
	 * Référence du gestionaire de formes
	 */
	private GestionaireFormes gestionaireRef;
	
	/**
	 * Référence de la fênetre principale
	 */
	private FenetrePrincipale fenetrePrincipaleRef;
	/**
	 * Cette méthode gére les actions de l'utilisateur
	 * @param action possibles pour l'utilisateur selon l'interface.
	 * 
	 */
	public void faireAction(Labo2Const.Actions action)
	{
		switch(action)
		{
			
			case AFFICHER_DIALOGUE_CONNEXION:
			{
				
				String reponse=null;
				reponse=fenetrePrincipaleRef.afficherReponseDialog(Labo2Const.Actions.AFFICHER_DIALOGUE_CONNEXION);
				if (reponse!=null)
				{
					commBaseRef.ouvrirConnexion(reponse.split(":"));
				}
				else if(fenetrePrincipaleRef!=null&&!fenetrePrincipaleRef.isVisible())
					{
						faireAction(Labo2Const.Actions.QUITTER_APPLICATION);	
					}
				
				break;
			}
		
			case FERMER_CONNEXION:
			{
				commBaseRef.fermerConnexion();
				break;
			}
			case QUITTER_APPLICATION:
			{
				if (commBaseRef.getConnexionClient()!=null)
				{
					commBaseRef.fermerConnexion();
					fenetrePrincipaleRef.repaint();
				}
				System.exit(0);
			}
		
			case DEMARRER_THREAD:
			{
				commBaseRef.start();
				break;
			}
			case AFFICHER_AIDE:
			{
				fenetrePrincipaleRef.afficherReponseDialog(Labo2Const.Actions.AFFICHER_AIDE);
				break;
			}
		case AFFICHER_FORMES:
			{
				gestionaireRef.afficherListe();
				break;	
			}	
		}
	}
	/**
	 * Appel la fonction trier formes de GestionaireFormes
	 * @param actionTri Enum qui définie tous les cas de tri possibles.
	 * @see GestionaireFormes.trierFormes 
	 * 
	 */
	public void faireAction(Labo2Const.ActionTrier actionTri)
	{
		gestionaireRef.trierFormes(actionTri);
	}
	
	private void setWindowListener()
	{
		//*Début du code emprunté
		fenetrePrincipaleRef.addWindowListener
		(new WindowAdapter()
			{
			 @Override
			 public void windowClosing(WindowEvent windowEvent) 
			 {
				 ControleurFrontal.this.faireAction(Labo2Const.Actions.QUITTER_APPLICATION);
		   	 }
			}
		);
		//Fin du code*
		//Source: http://stackoverflow.com/questions/9093448/do-something-when-the-close-button-is-clicked-on-a-jframe
	}
	public void setFenetrePrincipaleRef(FenetrePrincipale fenetrePrincipaleRef) 
	{
		this.fenetrePrincipaleRef = fenetrePrincipaleRef;
		//Pour capter l'évémement WindowClosing de la fênetre affectée
		this.setWindowListener();
	}
	public void setCommBaseRef(CommBase commBaseRef) 
	{
		this.commBaseRef = commBaseRef;
	}
	public void setGestionaireRef(GestionaireFormes gestionaireRef) 
	{
		this.gestionaireRef = gestionaireRef;
	}

	
}
